import java.util.Stack;

class MinStack {
    // 主栈，用于存储所有压入的元素
    private Stack<Integer> mainStack;
    // 最小栈，用于跟踪当前栈中的最小值
    private Stack<Integer> minimumTracker;

    // 构造函数，初始化两个栈
    public MinStack() {
        mainStack = new Stack<>();
        minimumTracker = new Stack<>();
    }

    // 压入元素到栈中
    public void push(int value) {
        // 将元素压入主栈
        mainStack.push(value);
        // 如果最小栈为空，直接压入当前值
        if (minimumTracker.isEmpty()) {
            minimumTracker.push(value);
        } else {
            // 获取当前最小值
            int currentMin = minimumTracker.peek();
            // 如果当前值小于等于当前最小值，压入辅助栈
            if (value <= currentMin) {
                minimumTracker.push(value);
            }
        }
    }

    // 弹出栈顶元素
    public void pop() {
        // 从主栈弹出元素
        int removedValue = mainStack.pop();
        // 如果弹出的元素等于最小栈的栈顶元素（当前最小值），也从最小栈弹出
        if (removedValue == minimumTracker.peek()) {
            minimumTracker.pop();
        }
    }

    // 获取栈顶元素（不弹出）
    public int top() {
        return mainStack.peek();
    }

    // 获取当前栈中的最小元素
    public int getMin() {
        return minimumTracker.peek();
    }
}